#include <iostream>
#include <vector>
using namespace std;
#define int long long
struct SegTreeLazyTag {
    vector<int> st;
    vector<int> lt;
    int n;
    SegTreeLazyTag(const vector<int>& a) {
        n = a.size();
        st.assign(n*4, 0);
        lt.assign(n*4, 0);
        build(1, 0, n - 1, a);
    }
    void build(int p, int l, int r, const vector<int>& a) {
        if(l == r) {
            st[p] = a[l];
            return;
        }
        int mid = (l + r) >> 1;
        build(p << 1, l, mid, a);
        build(p << 1 | 1, mid + 1, r, a);
        st[p] = st[p << 1] + st[p << 1 | 1];
    }
    void apply(int p, int l, int r, int val) { // 更新区间的值
        st[p] += val*(r - l + 1);
        lt[p] += val; // 打上懒标记，可以
    }
    void push(int p, int l, int r) // 向下更新我们的线段树
    {
        if(lt[p] != 0 && l != r) {
            int mid = (l + r) >> 1;
            apply(p << 1, l, mid, lt[p]);
            apply(p << 1 | 1, mid + 1, r, lt[p]);
            lt[p] = 0; // 回收懒标记
        }
    }
    void range_add(int l, int r, int val) {
        range_add(1, 0, n - 1, l , r, val);
    }
    void range_add(int p, int l, int r, int L, int R, int val) {
        if(R < l || r < L) {
            return;
        }
        if(L <= l && r <= R) {
            apply(p, l, r, val);
            return;
        }
        push(p, l, r);
        int mid = (l + r) >> 1;
        range_add(p << 1, l, mid, L, R, val);
        range_add(p << 1 | 1, mid + 1, r, L, R, val);
        st[p] = st[p << 1] + st[p << 1 | 1];
    }
    int range_query(int l, int r) {
        return range_query(1, 0, n - 1, l, r);
    }
    int range_query(int p, int l, int r, int L, int R) {
        if(R < l || r < L) {
            return 0;
        }
        if(L <= l && r <= R) {
            return st[p];
        }
        push(p, l, r);
        int mid = (l + r) >> 1;
        return range_query(p << 1, l, mid, L, R) + range_query(p << 1 | 1, mid + 1, r, L, R);
    }
};
signed main() {
    vector<int> a = {1, 2, 3, 4, 5};
    SegTreeLazyTag stlt(a);
    cout << stlt.range_query(0, 4) << endl;
    stlt.range_add(1, 3, 10);
    cout << stlt.range_query(0, 4) << endl;
    cout << stlt.range_query(2, 2) << endl;
    return 0;
}